# config.py
import os
import json
from classes import Config,ConfigDescription
import configparser
import argparse
import sys
def load_config() -> Config:
    """
    加载配置，优先级：命令行参数 > 配置文件 > 环境变量。
    :return: 合并后的配置字典。
    
    """

    config=Config()
    config=load_config_from_cmd(config)
    
    env=load_config_from_env(config)
    file=load_config_from_file(env,config.config_file_path)
    cmd=load_config_from_cmd(file)
    
    show_config(cmd) if config.verbose else 1

    return cmd

def load_config_from_env(configInput:Config) -> Config:
    """从环境变量读取配置
    
    Returns:
        Config: 配置对象
    """    
    config = configInput
    for key in os.environ:
        if hasattr(config, key.lower()):
            setattr(config, key.lower(), os.environ[key])
  
    return config
def load_config_from_cmd(configInput:Config) -> Config:
    """从命令行参数读取配置
    Returns:
        Config: 配置对象
        
    """ 
    
    config_description=ConfigDescription()
    parser = argparse.ArgumentParser()

    
    for items in vars(configInput).keys():
            match items: 
                case 'verbose':
                    parser.add_argument('--verbose', action='store_true', help='是否输出详细日志')
                case 'stream':
                    parser.add_argument('--stream', action='store_true', help='是否流式输出结果')
                case _:
                    parser.add_argument('--'+items, type=str, help=getattr(config_description, items))

    parser.add_argument('prompt',nargs='?', help="提示词输入")
    #TODO: if sys.stdin.readable() or 
        
    
    args=parser.parse_args()
    
  
    #ai生成的好聪明哦
    for key, value in vars(args).items():
        if value is not None:
            setattr(configInput, key, value)
    
    return configInput
    
    
    
    #文件名要在根目录
def load_config_from_file(configInput:Config,file_path: str='askai.conf') -> Config:
    try:
        parser = configparser.ConfigParser()
        parser.read(file_path,encoding='utf-8')
        
        parserItem=parser['askai']

        #记住这个setattr的用法        
        for key in parserItem:
            if parserItem[key] is not None:
                setattr(configInput, key, parserItem[key])
                
                configInput.stream = True if parserItem['stream'].lower() in ['true','yes','on','1'] else False
        #这一段好搞脑子
        # result_dict = {section: dict(parser[section]) for section in parser.sections()}
        
        return configInput
        
        # 检查配置文件格式
            
    except Exception as e:
        print(f'配置文件错误,检查配置文件{file_path}是否存在',)

    finally:
        return configInput
    
    
def show_config(configInput:Config):
    
    for key, value in configInput.__dict__.items():
        print(key, value)
    
if __name__ == '__main__':
    load_config()